package com.mornd.gulimall.seckill;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @author: mornd
 * @dateTime: 2023/8/29 - 7:56
 *
 * 整合 alibaba sentinel
 * 1、下载控制台jar https://github.com/alibaba/Sentinel/releases/tag/1.8.6
 * 2、引入maven依赖
 * 3、yml引入配置
 * 4、启动各个服务，访问某个请求，然后刷新sentinel控制台即可
 *
 * 默认实时监控数据在对应的微服务停止后，也随即删除了
 * 1、引入spring-boot-starter-actuator依赖
 * 2、yml 配置 management.endpoints.web.exposure.include: *
 *
 *
 * 使用：
 * 默认sentinel会处理controller层的请求
 * 也可以使用@SentinelResource标注在其它层
 * @SentinelResource标注的资源，在控制台都会显示（表现为一个子资源），然后在控制台配置流控规则
 * 注解标注的方法如果不手动声明抛出BlockException那么就会改为抛出UndeclaredThrowableException
 * 使用注解blockHandler属性表示失败回调的方法，需要为public，返回类型需要与原方法相匹配，参数类型需要和原方法相匹配并且最后加一个额外的参数，类型为 BlockException
 * blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数，则可以指定 blockHandlerClass 为对应的类的 Class 对象，注意对应的函数必需为 static 函数，否则无法解析。
 *
 * @SentinelResource注解参考文档：https://github.com/alibaba/Sentinel/wiki/注解支持
 */

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.mornd.gulimall.apis")
public class SeckillApplication {
    public static void main(String[] args) {
        SpringApplication.run(SeckillApplication.class, args);
    }
}
